/* ***** BEGIN LICENSE BLOCK *****
 * Version: RCSL 1.0/RPSL 1.0
 *
 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
 *
 * The contents of this file, and the files included with this file, are
 * subject to the current version of the RealNetworks Public Source License
 * Version 1.0 (the "RPSL") available at
 * http://www.helixcommunity.org/content/rpsl unless you have licensed
 * the file under the RealNetworks Community Source License Version 1.0
 * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
 * in which case the RCSL will apply. You may also obtain the license terms
 * directly from RealNetworks.  You may not use this file except in
 * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
 * applicable to this file, the RCSL.  Please see the applicable RPSL or
 * RCSL for the rights, obligations and limitations governing use of the
 * contents of the file.
 *
 * This file is part of the Helix DNA Technology. RealNetworks is the
 * developer of the Original Code and owns the copyrights in the portions
 * it created.
 *
 * This file, and the files included with this file, is distributed and made
 * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 *
 * Technology Compatibility Kit Test Suite(s) Location:
 *    http://www.helixcommunity.org/content/tck
 *
 * Contributor(s):
 *
 * ***** END LICENSE BLOCK ***** */

/**************************************************************************************
 * Fixed-point MP3 decoder
 * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
 * June 2003
 *
 * mp3common.h - implementation-independent API's, datatypes, and definitions
 **************************************************************************************/

#ifndef _MP3COMMON_H
#define _MP3COMMON_H

#include "mp3dec.h"
#include "statname.h"   /* do name-mangling for static linking */

#define MAX_SCFBD       4       /* max scalefactor bands per channel */
#define NGRANS_MPEG1    2
#define NGRANS_MPEG2    1

/* 11-bit syncword if MPEG 2.5 extensions are enabled */
#define SYNCWORDH       0xff
#define SYNCWORDL       0xe0

/* 12-bit syncword if MPEG 1,2 only are supported
 * #define  SYNCWORDH       0xff
 * #define  SYNCWORDL       0xf0
 */

typedef struct _MP3DecInfo {
    /* pointers to platform-specific data structures */
    void* FrameHeaderPS;
    void* SideInfoPS;
    void* ScaleFactorInfoPS;
    void* HuffmanInfoPS;
    void* DequantInfoPS;
    void* IMDCTInfoPS;
    void* SubbandInfoPS;

    /* buffer which must be large enough to hold largest possible main_data section */
    unsigned char mainBuf[MAINBUF_SIZE];

    /* special info for "free" bitrate files */
    int freeBitrateFlag;
    int freeBitrateSlots;

    /* user-accessible info */
    int bitrate;
    int nChans;
    int samprate;
    int nGrans;             /* granules per frame */
    int nGranSamps;         /* samples per granule */
    int nSlots;
    int layer;
    MPEGVersion version;

    int mainDataBegin;
    int mainDataBytes;

    int part23Length[MAX_NGRAN][MAX_NCHAN];

} MP3DecInfo;

typedef struct _SFBandTable {
    short l[23];
    short s[14];
} SFBandTable;

/* decoder functions which must be implemented for each platform */
MP3DecInfo* AllocateBuffers(void);
void FreeBuffers(MP3DecInfo* mp3DecInfo);
int CheckPadBit(MP3DecInfo* mp3DecInfo);
int UnpackFrameHeader(MP3DecInfo* mp3DecInfo, unsigned char* buf);
int UnpackSideInfo(MP3DecInfo* mp3DecInfo, unsigned char* buf);
int DecodeHuffman(MP3DecInfo* mp3DecInfo, unsigned char* buf, int* bitOffset, int huffBlockBits, int gr, int ch);
int Dequantize(MP3DecInfo* mp3DecInfo, int gr);
int IMDCT(MP3DecInfo* mp3DecInfo, int gr, int ch);
int UnpackScaleFactors(MP3DecInfo* mp3DecInfo, unsigned char* buf, int* bitOffset, int bitsAvail, int gr, int ch);
int Subband(MP3DecInfo* mp3DecInfo, short* pcmBuf);

/* mp3tabs.c - global ROM tables */
extern const int samplerateTab[3][3];
extern const short bitrateTab[3][3][15];
extern const short samplesPerFrameTab[3][3];
extern const short bitsPerSlotTab[3];
extern const short sideBytesTab[3][2];
extern const short slotTab[3][3][15];
extern const SFBandTable sfBandTable[3][3];

#endif  /* _MP3COMMON_H */
